package Servicios;

import DAO.DAOAsignatura;
import DAO.DAOAsignaturaReticula;
import DAO.DAOProgramaEducativo;
import DAO.DAORequerimientoAcademico;
import DAO.DAOSemestres;
import Dominio.Asignatura;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GestorDeDependenciasDidacticas extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        String nombrePE = request.getParameter("nombrePE");
        String evento = request.getParameter("evento");
        if (evento.equals("mostrarCarreras")) {
            mostrarCarreras(request, response, nombrePE);
        } else {
            if (evento.equals("registrarDependencias")) {
                registrarDependencias(request, response, nombrePE);
            }
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private void mostrarCarreras(HttpServletRequest request, HttpServletResponse response, String nombrePE) {
        PrintWriter out = null;
        try {
            String respuesta = "";
            out = response.getWriter();
            DAOProgramaEducativo daoPE = new DAOProgramaEducativo();
            DAOSemestres daoSemestre = new DAOSemestres();
            DAOAsignaturaReticula daoAsigRet = new DAOAsignaturaReticula();
            DAOAsignatura daoAsig = new DAOAsignatura();
            int claveRA = daoPE.obtenerClaveReticulaAcademica(nombrePE);
            if (claveRA == 0) {
                System.out.println("No hay programa educativo con nombre " + nombrePE);
            } else {
                ArrayList<Integer> listaClvsSemestres = daoSemestre.obtenerClavesSemestre(claveRA);
                if (listaClvsSemestres.isEmpty()) {
                    System.out.println("no hay claves de reticulas");
                } else {
                    //juntar todas las asignaturas de todos los semestres
                    ArrayList<Asignatura> listaAsignaturasTodas = new ArrayList<Asignatura>();
                    for (int q = 0; q < listaClvsSemestres.size(); q++) {
                        int claveSemestre = listaClvsSemestres.get(q);
                        ArrayList<Asignatura> listaAsignaturas = daoAsigRet.obtenerAsignaturasDeSemestre(claveSemestre);
                        for (int l = 0; l < listaAsignaturas.size(); l++) {
                            Asignatura asignatura = listaAsignaturas.get(l);
                            listaAsignaturasTodas.add(asignatura);
                        }
                    }
                    respuesta += "<table>";
                    respuesta += "<th>Asignatura dependiente</th>";
                    respuesta += "<th>Depende de</th>";
                    respuesta += "<th>Depende de</th>";
                    respuesta += "<th>Depende de</th>";
                    respuesta += "<th>Accion</th>";


                    for (int j = 0; j < listaAsignaturasTodas.size(); j++) {
                        Asignatura asignatura = listaAsignaturasTodas.get(j);

                        //imprimimos la respuesta al administrador
                        respuesta += "<tr>"
                                + "<td id = ' " + asignatura.getClave_asignatura() + "'>" + asignatura.getNombre() + "</td>"
                                //primer combobox
                                + "<td>"
                                + "<select id='" + (j + 1) + "1' name = 'materias'>";
                        respuesta += "<option value = '0'>Seleccione dependencia</option>";
                        for (int k = 0; k < listaAsignaturasTodas.size(); k++) {
                            respuesta += "<option value = '" + listaAsignaturasTodas.get(k).getClave_asignatura() + "'>" + listaAsignaturasTodas.get(k).getNombre() + "</option>";
                        }

                        respuesta += "</select>"
                                + "</td>"
                                //segundo combobox        
                                + "<td>"
                                + "<select id='" + (j + 1) + "2' name = 'materias'>";
                        respuesta += "<option value = '0'>Seleccione dependencia</option>";
                        for (int c = 0; c < listaAsignaturasTodas.size(); c++) {
                            respuesta += "<option value = '" + listaAsignaturasTodas.get(c).getClave_asignatura() + "'>" + listaAsignaturasTodas.get(c).getNombre() + "</option>";
                        }

                        respuesta += "</select>"
                                + "</td>"
                                //tercer combobox
                                + "<td>"
                                + "<select id='" + (j + 1) + "3' name = 'materias'>";
                        respuesta += "<option value = '0'>Seleccione dependencia</option>";
                        for (int h = 0; h < listaAsignaturasTodas.size(); h++) {
                            respuesta += "<option value = '" + listaAsignaturasTodas.get(h).getClave_asignatura() + "'>" + listaAsignaturasTodas.get(h).getNombre() + "</option>";
                        }
                        respuesta += "</select>"
                                + "</td>"
                                + "<td><input id = 'botonDependencias' type='button' title = '" + nombrePE + "' value = 'Registrar dependencia didactica' onclick= 'registrarDependencias(" + listaAsignaturasTodas.get(j).getClave_asignatura() + "," + (j + 1) + "1," + (j + 1) + "2," + (j + 1) + "3)'></td>"
                                + "</tr>";
                    }

                    respuesta += "<table>";


                    out.println(respuesta);
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(GestorDeDependenciasDidacticas.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            out.close();
        }
    }

    private void registrarDependencias(HttpServletRequest request, HttpServletResponse response, String nombrePE) {

        String clvInde1 = request.getParameter("claveInde1");
        String clvInde2 = request.getParameter("claveInde2");
        String clvInde3 = request.getParameter("claveInde3");
        String clvDep = request.getParameter("claveDep");
        int claveInde1 = Integer.parseInt(clvInde1);
        int claveInde2 = Integer.parseInt(clvInde2);
        int claveInde3 = Integer.parseInt(clvInde3);
        int claveDep = Integer.parseInt(clvDep);
        DAORequerimientoAcademico daoreq = new DAORequerimientoAcademico();
        DAOProgramaEducativo daoPE = new DAOProgramaEducativo();
        int clavePE = daoPE.obtenerClavePE(nombrePE);
        ArrayList<Integer> listaClavesIndependientes = new ArrayList<Integer>();
        if (claveInde1 > 0) {
            listaClavesIndependientes.add(claveInde1);
        }
        if (claveInde2 > 0 && claveInde2 != claveInde1) {
            listaClavesIndependientes.add(claveInde2);
        }
        if (claveInde3 > 0 && claveInde3 != claveInde2 && claveInde3 != claveInde1) {
            listaClavesIndependientes.add(claveInde3);
        }
        if (daoreq.existeAsignaturaDependiente(claveDep)) {
            daoreq.eliminarAsignaturaDependiente(claveDep);
            registrarAsignaturasDependiente(daoreq, listaClavesIndependientes, clavePE, claveDep);
            //respuesta = "<h1>Se han agregado las dependencias<h1>";
        } else {
            registrarAsignaturasDependiente(daoreq, listaClavesIndependientes, clavePE, claveDep);
            //respuesta = "<h1>Se han agregado las dependencias<h1>";
        }
        //  return respuesta;
    }

    private void registrarAsignaturasDependiente(DAORequerimientoAcademico daoreq, ArrayList<Integer> listaDeClavesAsignaturas, int clavePE, int claveDep) {
        for (int i = 0; i < listaDeClavesAsignaturas.size(); i++) {
            daoreq.registrarReqAcademico(listaDeClavesAsignaturas.get(i), clavePE, claveDep);
        }
    }
}
